/* 获取元素 */
const resultEl = document.getElementById("result");
const lengthEl = document.getElementById("length");
const uppercaseEl = document.getElementById("uppercase");
const lowercaseEl = document.getElementById("lowercase");
const numbersEl = document.getElementById("numbers");
const symbolsEl = document.getElementById("symbols");
const generateEl = document.getElementById("generate");
const clipboardEl = document.getElementById("clipboard");
/* 初始化 */
// const randomFunc = {
//   lower: getRandomLower,
//   upper: getRandomUpper,
//   number: getRandomNumber,
//   symbol: getRandomSymbol,
// };
const randomFunc = {
  lower: () => {
    return String.fromCharCode(Math.floor(Math.random() * 26) + 97);
  },
  upper: () => {
    return String.fromCharCode(Math.floor(Math.random() * 26) + 65);
  },
  number: () => {
    return String.fromCharCode(Math.floor(Math.random() * 10) + 48);
  },
  symbol: () => {
    const symbols = "!@#$%^&*(){}[]=<>/,.";
    return symbols[Math.floor(Math.random() * symbols.length)];
  },
};

clipboardEl.addEventListener("click", () => {
  /* 创建一个textarea元素赋值给textarea */
  const textarea = document.createElement("textarea");
  /* 获取resultEl元素内容 */
  const password = resultEl.innerText;
  /* 不存在直接返回出去 */
  if (!password) {
    return;
  }
  /* resultEl元素内容赋值给创建的 textarea的value属性 */
  textarea.value = password;
  /* 往body中添加textarea元素 */
  document.body.appendChild(textarea);
  /*  */
  textarea.select();
  document.execCommand("copy");
  textarea.remove();
  alert("Password copied to clipboard!");
});
generateEl.addEventListener("click", () => {
  const length = +lengthEl.value;
  const hasLower = lowercaseEl.checked;
  const hasUpper = uppercaseEl.checked;
  const hasNumber = numbersEl.checked;
  const hasSymbol = symbolsEl.checked;

  resultEl.innerText = generatePassword(
    hasLower,
    hasUpper,
    hasNumber,
    hasSymbol,
    length
  );
});

function generatePassword(lower, upper, number, symbol, length) {
  let generatedPassword = "";
  const typesCount = lower + upper + number + symbol;
  const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => Object.values(item)[0]
  );

  if (typesCount === 0) {
    return "";
  }

  for (let i = 0; i < length; i += typesCount) {
    typesArr.forEach((type) => {
      const funcName = Object.keys(type)[0];
      generatedPassword += randomFunc[funcName]();
    });
  }

  const finalPassword = generatedPassword.slice(0, length);

  return finalPassword;
}
